// pkg/registry/estargz.go
// estargz 兼容支持

package registry

import (
	"context"
	"fmt"
)

// EstargzIndex estargz 索引信息
type EstargzIndex struct {
	Entries []EstargzEntry `json:"entries"`
}

// EstargzEntry estargz 条目
type EstargzEntry struct {
	Name        string `json:"name"`
	Type        string `json:"type"` // file, dir, symlink
	Size        int64  `json:"size"`
	Offset      int64  `json:"offset"`
	ChunkDigest string `json:"chunkDigest,omitempty"`
}

// EstargzHandler estargz 处理器
type EstargzHandler struct {
	client *Client
}

// NewEstargzHandler 创建 estargz 处理器
func NewEstargzHandler(client *Client) *EstargzHandler {
	return &EstargzHandler{client: client}
}

// FetchLayerIndex 获取 estargz 层索引
func (h *EstargzHandler) FetchLayerIndex(ctx context.Context, ref *ImageRef, layerDigest string) (*EstargzIndex, error) {
	// estargz 索引通常存储在层的元数据中
	// 这是一个简化的实现
	return &EstargzIndex{}, nil
}

// IsEstargzLayer 检查层是否为 estargz 格式
func (h *EstargzHandler) IsEstargzLayer(mediaType string) bool {
	// 检查 mediaType 是否为 estargz 兼容类型
	return mediaType == "application/vnd.containerd.image.rootfs.diff.tar.gzip"
}

// SupportsLazyPull 检查是否支持懒加载
func (h *EstargzHandler) SupportsLazyPull(manifest *Manifest) bool {
	// 检查是否所有层都支持 lazy pull
	for _, layer := range manifest.Layers {
		if !h.IsEstargzLayer(layer.MediaType) {
			return false
		}
	}
	return true
}

// FallbackToFullPull 回退到全量拉取
func (h *EstargzHandler) FallbackToFullPull(ctx context.Context, ref *ImageRef, digest string) ([]byte, error) {
	// 全量拉取层内容
	return h.client.PullLayerPartial(ctx, ref, digest, 0, 1<<63-1)
}

// ---
